import { ElMessage } from "element-plus";

interface WebSocketProps {
    url: string; // websocket地址
    heartTime?: number; // 心跳时间间隔，默认为 50000 ms
    heartMsg?: WebSocketMsg; // 心跳信息，默认为'ping'
    reconnectCount?: number; // 重连次数，默认为 5
    reconnectTime?: number; // 重连时间间隔，默认为 10000 ms
    message: (ev: MessageEvent) => any; // 接收消息的回调
    open?: (ev: Event) => any; // 连接成功的回调
    close?: (ev: CloseEvent) => any; // 关闭的回调
    error?: (ev: Event) => any; // 错误的回调
}
export interface WebSocketMsg {
    Type: String; // 类型，根据实际需求替换
    Topic: String; // 主题，根据实际需求替换
    RequestId: String; // 假设这是一个生成请求ID的函数
    TargetCodes?: String[]; //定向标识 --userid-xxx
    Parameter?: any; // 示例参数对象，可根据需要填充
    Data?: any // 消息内容
}

// webSocket 对象
let webSocket: WebSocket | null = null;
// webSocket定时器id
let setIntervalId: NodeJS.Timeout | null = null;

export const initWebSocket = (config: WebSocketProps) => {
    if (typeof WebSocket === "undefined") {
        ElMessage.error("您的浏览器不支持Websocket通信协议，请使用Chrome或者其他高版本的浏览器！");
        return;
    }
    if (webSocket != null && webSocket.readyState === webSocket.OPEN) {
        return webSocket;
    }
    createWebSocket(config);
    return webSocket;
};

/**
 * 创建WebSocket
 * @param config
 */
const createWebSocket = (config: WebSocketProps) => {
    // 初始化 WebSocket
    webSocket = new WebSocket(config.url);
    webSocket.onopen = (ev: Event) => {
        config.open && config.open(ev);
        /**
         * 发送心跳
         * 使用Nginx代理WebSocket的时候，客户端与服务器握手成功后，如果在60秒内没有数据交互，就会自动断开连接。
         * Nginx默认的断开链接时间为60秒
         */
        sendPing(config.heartTime ?? 50000, config.heartMsg ?? {
            Type: 'heart', // 假设服务端约定的订阅操作关键字
            Topic: 'ping',
            TargetCodes: [],
            RequestId: "",
            Data: "ping",
            // 其他字段...
        });
    };
    webSocket.onmessage = (ev: MessageEvent) => config.message(ev);
    webSocket.onerror = (ev: Event) => error(config, ev);
    webSocket.onclose = (ev: CloseEvent) => close(config, ev);
};

/**
 * 发送心跳
 * @param {number} heartTime 心跳间隔毫秒 默认50000
 * @param {WebSocketMsg} heartMsg 心跳名称 默认字符串ping
 */
const sendPing = (heartTime: number, heartMsg: WebSocketMsg) => {
    webSocket?.send(JSON.stringify(heartMsg));
    setIntervalId = setInterval(() => {
        // console.log(2222222,heartTime,heartMsg);
        webSocket?.send(JSON.stringify(heartMsg));
    }, heartTime);
};

/**
 * WebSocket 关闭的回调方法
 * @param config
 */
const close = (config: WebSocketProps, ev: CloseEvent) => {
    config.close && config.close(ev);
    clearInterval(Number(setIntervalId));
};

// let flag = false;
// // 重连次数
// let reconnectCount = 0;
// // 重连定时器id
// let reconnectId: NodeJS.Timeout | null = null;

/**
 * WebSocket 关闭的回调方法
 * @param config
 */
const error = (config: WebSocketProps, ev: Event) => {
    config.error && config.error(ev);
    // if (flag) return;
    // reconnectId = setInterval(() => {
    //     flag = true;
    //     reconnectCount++;
    //     console.log("正在重新连接，次数" + reconnectCount);
    //     let socket = initWebSocket(config);
    //     if (socket?.readyState === socket?.OPEN) {
    //         reconnectCount = 0;
    //         flag = false;
    //         clearInterval(Number(reconnectId));
    //     }
    //     if (reconnectCount >= 5) {
    //         clearInterval(Number(reconnectId));
    //     }
    // }, config.reconnectTime ?? 10000);
};
